package br.com.acs.CameraIP.controller;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.com.acs.CameraIP.dao.ClienteDao;
import br.com.acs.CameraIP.dao.ClienteDaoImp;
import br.com.acs.CameraIP.model.Cliente;

@ManagedBean
@SessionScoped
public class ClienteController {

    private Cliente cliente = new Cliente();
    private DataModel<Cliente> listaClientes;
    private StreamedContent imagemLogo;

	public void handleFileUpload(FileUploadEvent event) {
		try {
		   imagemLogo = new DefaultStreamedContent(event.getFile().getInputstream());
		   byte[] logomarca = event.getFile().getContents();
		   this.cliente.setLogomarca(logomarca);
		} catch (IOException ex) {
		  Logger.getLogger(ClienteController.class.getName()).log(Level.SEVERE, null, ex);
		}
	}
	
	public void handleFileUploadToFile(FileUploadEvent event) throws IOException {
		byte[] foto = event.getFile().getContents();
		String nomeArquivo = event.getFile().getFileName();
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
		String arquivo = scontext.getRealPath("/WEB-INF/upload/" + nomeArquivo);
		criaArquivo(foto, arquivo);
	}
	
	public void limparImagemLogo() {
	   this.imagemLogo = new DefaultStreamedContent();
	}
	
	public StreamedContent getImagemLogo() {
	   return imagemLogo;
	}

	public void setImagemLogo(StreamedContent imagemLogo) {
	   this.imagemLogo = imagemLogo;
	}

    public DataModel<Cliente> getListarEmpresasTodos() {
        List<Cliente> lista = new ClienteDaoImp().listTodos();
        listaClientes = new ListDataModel<Cliente>(lista);
        return listaClientes;
    }
    
    public DataModel<Cliente> getListarEmpresasAtivos() {
        List<Cliente> lista = new ClienteDaoImp().listAtivos();
        listaClientes = new ListDataModel<Cliente>(lista);
        return listaClientes;
    }
    
    public Cliente getEmpresa() {
    	
        return cliente;
    }

    public void setEmpresa(Cliente empresa) {
        this.cliente = empresa;
    }
    
	public void prepararAdicionarEmpresa(ActionEvent actionEvent){
    	cliente = new Cliente();
    }
	
    public void prepararAlterarEmpresa(ActionEvent actionEvent) throws IOException{
    	cliente = (Cliente)(listaClientes.getRowData());
   	    try {  
  	    	 imagemLogo = new DefaultStreamedContent(new ByteArrayInputStream(cliente.getLogomarca()));
  	    } catch (Exception e) {  
            BufferedImage bufferedImg = new BufferedImage(100, 25, BufferedImage.TYPE_INT_RGB);  
            Graphics2D g2 = bufferedImg.createGraphics();  
            g2.drawString("Logo", 0, 10);  
            ByteArrayOutputStream os = new ByteArrayOutputStream();  
            ImageIO.write(bufferedImg, "png", os);  
            imagemLogo = new DefaultStreamedContent(new ByteArrayInputStream(os.toByteArray()), "image/png"); 
  	    } finally {  
  	    }  
    }
    
	public void salvaEmpresa() {
		ClienteDao dao = new ClienteDaoImp();
		try {
			dao.save(cliente);	
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO,"Registro salvo", "Mensagem"));
		} catch (Exception ex) {
			ex.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro, ao salvar registro", "Mensagem"));
		} finally {
			cliente = new Cliente();
		}
	}

    public String excluirEmpresa(){

    	Cliente empresaTemp = (Cliente)(listaClientes.getRowData());
    	ClienteDao dao = new ClienteDaoImp();
        dao.remove(empresaTemp);
        return "cadEmpresas";

    }

    public void adicionarEmpresa(ActionEvent actionEvent){

    	ClienteDao dao = new ClienteDaoImp();
        dao.save(cliente);
        
    }

    public void alterarEmpresa(ActionEvent actionEvent){

    	ClienteDao dao = new ClienteDaoImp();
        dao.update(cliente);

    }
    public String reinit() {  
        cliente = new Cliente();
        return null;  
    } 
    
    
    public void criaArquivo(byte[] bytes, String arquivo) {
    	FileOutputStream fos;
    	try {
    	   fos = new FileOutputStream(arquivo);
    	   fos.write(bytes);
    	   fos.close();
    	} catch (FileNotFoundException ex) {
    	   Logger.getLogger(ClienteController.class.getName()).log(Level.SEVERE, null, ex);
    	} catch (IOException ex) {
    	   Logger.getLogger(ClienteController.class.getName()).log(Level.SEVERE, null, ex);
    	}
    }
 
}
